import unittest
import os
from src.plotting import check_test_time, check_test_result, json_in_class, check_broken_fix_test, sorted_result, id_name, identify_broken_test
from src.sup_function import get_test_data_path
from src.general_function import get_all_utest_dirs


class FileTest(unittest.TestCase):
    def test_check_test_result(self):
        """
        тест, который проверяет корректность вывода функции check_test_result
        :return:
        """
        actual = check_test_result('Ring',
                                   json_in_class(get_all_utest_dirs(os.path.join(get_test_data_path(), "test_check_test_result"))))
        expected = [("rev_108786 CheckingStrategy.full_check", True)]
        self.assertEqual(expected, actual)

    def test_check_test_result_no_correct_name(self):
        """
        тест, который проверяет поведение функции при некорректо введеных данныx(name)
        :return:
        """
        actual = check_test_result(1324,
                                   json_in_class(get_all_utest_dirs(
                                       os.path.join(get_test_data_path(), "test_check_test_result"))))
        expected = []
        self.assertEqual(expected, actual)

    def test_check_test_result_no_correct_path(self):
        """
        тест, который проверяет поведение функции при некорректо введеных данныx(path)
        :return:
        """
        actual = check_test_result("Ring",
                                   json_in_class(get_all_utest_dirs(
                                       os.path.join(get_test_data_path(), "test_check"))))
        expected = []
        self.assertEqual(expected, actual)

    def test_check_test_result_no_correct_path_int(self):
        """
        тест, который проверяет поведение функции при некорректо введеных данныx(path)
        :return:
        """
        actual = check_test_result("Ring", 123)
        expected = []
        self.assertEqual(expected, actual)

    def test_check_test_time(self):
        """
        тест, который проверяет корректность вывода функции check_test_time
        :return:
        """
        actual = check_test_time('Ring',
                                 json_in_class(get_all_utest_dirs(os.path.join(get_test_data_path(),
                                                                               "test_check_test_result"))))
        print(actual)
        expected = [("rev_108786 CheckingStrategy.full_check", 5497)]
        self.assertEqual(expected, actual)

    def test_check_broker_fix_test(self):
        """
        тест, который проверяет корректность вывода функции check_test
        :return:
        """
        actual_brok, actual_fix = check_broken_fix_test([("rev_1", True), ("rev_2", False), ("rev_3", True), ("rev_4", None)])
        expected_brok = ["rev_2", "rev_4"]
        expected_fix = ["rev_3"]
        self.assertEqual(expected_brok, actual_brok)
        self.assertEqual(expected_fix, actual_fix)

    def test_check_broker_fix_test_2(self):
        """
        тест, который проверяет корректность вывода функции check_test
        :return:
        """
        actual_brok, actual_fix = check_broken_fix_test([("rev_1", True), ("rev_2", True), ("rev_3", True), ("rev_4", True)])
        expected_brok = [True]
        expected_fix = [True]
        self.assertEqual(expected_brok, actual_brok)
        self.assertEqual(expected_fix, actual_fix)

    def test_check_test_no_correct(self):
        """
        тест, который проверяет поведение функции check_test при некорректо введеных данныx
        :return:
        """
        actual_brok, actual_fix = check_broken_fix_test(123)
        self.assertEqual([False], actual_brok)

    def test_sorted_result(self):
        """
        тест, который проверяет корректность вывода функции sorted_result
        :return:
        """
        actual = sorted_result([("123", True), ("rev_4", False), ("124", True), ("rev_2", None)])
        expected = [("rev_2", None), ("rev_4", False), ("123", True), ("124", True)]
        self.assertEqual(expected, actual)

    def test_sorted_result_no_correct_list(self):
        """
        тест, который проверяет поведение функции sorted_result при некорректо введеных данныx
        :return:
        """
        actual = sorted_result(123)
        expected = []
        self.assertEqual(expected, actual)

    def test_id_name(self):
        """
        тест, который проверяет корректность вывода функции id_name
        :return:
        """
        actual = id_name([("rev_2", None), ("rev_4", False), ("123", True), ("124", True)])
        expected = ["rev_2", "rev_4", "123", "124"]
        self.assertEqual(expected, actual)

    def test_broken_test_fix(self):
        actual = identify_broken_test([("rev_2", None), ("rev_4", False), ("rev_123", True), ("rev_124", True)])
        expected = 'тест работает'
        self.assertEqual(expected, actual)

    def test_broken_test_brokensvn(self):
        actual = identify_broken_test([("rev_2", None), ("rev_4", False), ("rev_123", True), ("rev_124", False)])
        expected = '124'
        self.assertEqual(expected, actual)

    def test_broken_test_brokengit(self):
        actual = identify_broken_test([("rev_2", None), ("rev_4", False), ("rev_123", True), ("4bb44b4_124_4kj23b", False)])
        expected = '4kj23b'
        self.assertEqual(expected, actual)

    def test_broken_test_allbroken(self):
        actual = identify_broken_test([("rev_2", None), ("rev_4", False), ("rev_123", None), ("4bb44b4_124_4kj23b", False)])
        expected = 'тест сломан на протяжении всего данного периода'
        self.assertEqual(expected, actual)

    def test_broken_test_nocorrect(self):
        actual = identify_broken_test([])
        expected = ''
        self.assertEqual(expected, actual)
        actual = identify_broken_test([123, 312])
        expected = 'Некорректные данные'
        self.assertEqual(expected, actual)

if __name__ == '__main__':
    unittest.main()